#include <str.hpp>

std::vector<std::string> split(
    const std::string& str,
    const std::string& delim,
    bool collapse
) {
    std::vector<std::string> result;
    // 如果分隔符为空, 直接返回原字符串
    if (delim.empty()) {
        result.push_back(str);
        return result;
    }

    size_t start = 0;                       // 起始位置
    size_t len_str = str.length();          // 字符串长度
    size_t len_delim = delim.length();      // 分隔符长度
    while (start <= len_str) {
        // 查找下一个分隔符的位置
        size_t pos = str.find(delim, start);
        // 没有找到分隔符, 添加剩余子串并退出
        // std::string::npos 静态常量, 用于表示未找到的状态.
        if (pos == std::string::npos) {
            result.push_back(str.substr(start));
            break;
        }
        // 添加当前字串 (从 start 到分隔符前)
        result.push_back(str.substr(start, pos - start));
        // 寻找新的起始位置, 上一个分隔符起始位置 + 分隔符长度
        start = pos + len_delim;
        // 跳过分隔符 
        if (collapse) {
            while (start + len_delim <= len_str) {
                // 检查后续是否还是分隔符
                if (str.compare(start, len_delim, delim) == 0) {
                    start += len_delim;
                } else {
                    break;
                }
            }
        }
    }

    return result;
}

std::string trimLeadingDelimiters(const std::string& str, const std::string& delim){
    // 如果分隔符为空, 直接返回原字符串
    if (delim.empty()) {
        return str;
    }

    // 正向查找第一个与指定字符(串)中任意字符都不匹配的字符,
    // size_t pos = str.find_first_not_of(delim);
    // return str.substr(pos);

    // 分别获取字符串和分隔符的长度
    size_t len_str = str.length();
    size_t len_delim = delim.length();
    size_t total_skip = 0;
    while (total_skip <= len_str - len_delim) {
        // 分隔符匹配
        if (str.compare(total_skip, len_delim, delim) == 0) {
            total_skip += len_delim;
        } else {
            break;
        }
    }
    return str.substr(total_skip);
}
